package com.lhy.wanandroid.base

import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import com.gyf.immersionbar.ImmersionBar
import com.hjq.bar.TitleBar
import com.lhy.base.BaseVmFragment
import com.hjq.http.EasyHttp
import com.hjq.umeng.UmengClient
import com.lhy.demo.action.TitleBarAction
import com.lhy.demo.action.ToastAction


abstract class MyBaseVmFragment<VM:BaseViewModel> : BaseVmFragment(), ToastAction, TitleBarAction {
    /** 标题栏对象  */
    private var mTitleBar: TitleBar? = null

    /** 状态栏沉浸  */
    private var mImmersionBar: ImmersionBar? = null

    protected lateinit var mViewModel: VM

    override fun initFragment() {
        if (titleBar != null) {
            titleBar!!.setOnTitleBarListener(this)
        }
        initImmersion()
        super.initFragment()

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initView()
        initViewModel()
        observe()
        // 因为Fragment恢复后savedInstanceState不为null，
        // 重新恢复后会自动从ViewModel中的LiveData恢复数据，
        // 不需要重新初始化数据。
        if (savedInstanceState == null) {
            initData()
        }
    }

    private fun initViewModel() {
        mViewModel = ViewModelProvider(this).get(viewModelClass())
    }

    abstract fun viewModelClass(): Class<VM>

    open fun observe() {

    }

    /**
     * 初始化沉浸式
     */
    protected open fun initImmersion() {

        // 初始化沉浸式状态栏
        if (isStatusBarEnabled()) {
            statusBarConfig()!!.init()

            // 设置标题栏沉浸
            if (mTitleBar != null) {
                ImmersionBar.setTitleBar(this, mTitleBar)
            }
        }
    }

    /**
     * 是否在Fragment使用沉浸式
     */
    open fun isStatusBarEnabled(): Boolean {
        return false
    }

    /**
     * 获取状态栏沉浸的配置对象
     */
    protected open fun getStatusBarConfig(): ImmersionBar? {
        return mImmersionBar
    }

    /**
     * 初始化沉浸式
     */
    private  fun statusBarConfig(): ImmersionBar? {
        //在BaseActivity里初始化
        mImmersionBar = ImmersionBar.with(this) // 默认状态栏字体颜色为黑色
                .statusBarDarkFont(statusBarDarkFont()) // 解决软键盘与底部输入框冲突问题，默认为false，还有一个重载方法，可以指定软键盘mode
                .keyboardEnable(true)
        return mImmersionBar
    }

    /**
     * 获取状态栏字体颜色
     */
    protected open fun statusBarDarkFont(): Boolean {
        // 返回真表示黑色字体
        return true
    }

    override fun getTitleBar(): TitleBar? {
        if (mTitleBar == null) {
            mTitleBar = findTitleBar(view as ViewGroup)
        }
        return mTitleBar
    }

//    /**
//     * 当前加载对话框是否在显示中
//     */
//    open fun isShowDialog(): Boolean {
//        return attachActivity.isShowDialog()
//    }
//
//    /**
//     * 显示加载对话框
//     */
//    open fun showDialog() {
//        attachActivity.showDialog()
//    }
//
//    /**
//     * 隐藏加载对话框
//     */
//    open fun hideDialog() {
//        attachActivity.hideDialog()
//    }

    override fun onResume() {
        super.onResume()
        // 重新初始化状态栏
        statusBarConfig()!!.init()
        UmengClient.onResume(this)
    }

    override fun onPause() {
        UmengClient.onPause(this)
        super.onPause()
    }

    override fun onDetach() {
        EasyHttp.cancel(this)
        super.onDetach()
    }
}